package com.LinLight.util;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuffXfermode;
import android.graphics.Bitmap.Config;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.Drawable;

//图片处理方法的公共类
public class BitmapUtil {
	public static Bitmap createReflectedBitmap(Bitmap srcBitmap) {
		if (null == srcBitmap) {
			return null;
		}

		// The gap between the reflection bitmap and original bitmap.
		final int REFLECTION_GAP = 4;

		int srcWidth = srcBitmap.getWidth();
		int srcHeight = srcBitmap.getHeight();
		int reflectionWidth = srcBitmap.getWidth();
		int reflectionHeight = srcBitmap.getHeight() / 2;

		if (0 == srcWidth || srcHeight == 0) {
			return null;
		}

		// The matrix
		Matrix matrix = new Matrix();
		matrix.preScale(1, -1);

		try {
			// The reflection bitmap, width is same with original's, height is
			// half of original's.
			Bitmap reflectionBitmap = Bitmap.createBitmap(srcBitmap, 0,
					srcHeight / 2, srcWidth, srcHeight / 2, matrix, false);

			if (null == reflectionBitmap) {
				return null;
			}

			// Create the bitmap which contains original and reflection bitmap.
			Bitmap bitmapWithReflection = Bitmap.createBitmap(reflectionWidth,
					srcHeight + reflectionHeight + REFLECTION_GAP,
					Config.ARGB_8888);

			if (null == bitmapWithReflection) {
				return null;
			}

			// Prepare the canvas to draw stuff.
			Canvas canvas = new Canvas(bitmapWithReflection);

			// Draw the original bitmap.
			canvas.drawBitmap(srcBitmap, 0, 0, null);

			// Draw the reflection bitmap.
			canvas.drawBitmap(reflectionBitmap, 0, srcHeight + REFLECTION_GAP,
					null);

			Paint paint = new Paint();
			paint.setAntiAlias(true);
			LinearGradient shader = new LinearGradient(0, srcHeight, 0,
					bitmapWithReflection.getHeight() + REFLECTION_GAP,
					0x70FFFFFF, 0x00FFFFFF, TileMode.MIRROR);
			paint.setShader(shader);
			paint.setXfermode(new PorterDuffXfermode(
					android.graphics.PorterDuff.Mode.DST_IN));

			// Draw the linear shader.
			canvas.drawRect(0, srcHeight, srcWidth,
					bitmapWithReflection.getHeight() + REFLECTION_GAP, paint);

			return bitmapWithReflection;
		} catch (Exception e) {
			e.printStackTrace();
		}

		return null;
	}

	/**
	 * Load bitmap file from sd card.
	 * 
	 * @param strPath
	 *            The bitmap file path.
	 * 
	 * @return The Bitmap object, the returned value may be null.
	 */
	public static Bitmap drawableToBitmap(Drawable drawable) {
		if (null == drawable) {
			return null;
		}

		int width = drawable.getIntrinsicWidth();
		int height = drawable.getIntrinsicHeight();

		return drawableToBitmap(drawable, width, height);
	}

	/**
	 * Load bitmap file from sd card.
	 * 
	 * @param strPath
	 *            The bitmap file path.
	 * 
	 * @return The Bitmap object, the returned value may be null.
	 */
	public static Bitmap drawableToBitmap(Drawable drawable, int width,
			int height) {
		if (null == drawable || width <= 0 || height <= 0) {
			return null;
		}

		Config config = (drawable.getOpacity() != PixelFormat.OPAQUE) ? Config.ARGB_8888
				: Config.RGB_565;

		Bitmap bitmap = null;

		try {
			bitmap = Bitmap.createBitmap(width, height, config);
			if (null != bitmap) {
				Canvas canvas = new Canvas(bitmap);
				drawable.setBounds(0, 0, width, height);
				drawable.draw(canvas);
			}
		} catch (OutOfMemoryError e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return bitmap;
	}
	
	public static Bitmap zoomBitmap(Bitmap bitmap,int w,int h){   
        int width = bitmap.getWidth();   
        int height = bitmap.getHeight();   
        Matrix matrix = new Matrix();   
        float scaleWidht = ((float)w / width);   
        float scaleHeight = ((float)h / height);   
        matrix.postScale(scaleWidht, scaleHeight);   
        Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);   
        return newbmp;   
    }  
}